package tests;

import java.util.Collection;
import java.util.ArrayList;

import org.junit.Test;
import org.junit.Before;
import org.junit.Assert;

import modelo.excepciones.LadronAtrapado;
import modelo.*;




public class TestCaso {	
 
	Caso casoActual;
	Ciudad ciudadDeSalida;
	Ciudad ciudadDeLlegada;
	BibliotecaDeLadrones ladrones;
	Ladron unLadron;
	
	@Before
	public void inicializarObjetos(){
		
		DiaYHora lunes7hs = new DiaYHora("Lunes",7);
		DiaYHora domingo17hs = new DiaYHora("Domingo",17);
		Tiempo elTiempo = new Tiempo(lunes7hs,domingo17hs);				
		
		this.unLadron = new Ladron("Lady Agatha", new Femenino(), new Tenis(), new Rojo(), new Anillo(), new Descapotable());
		
		Collection<String> religiones = new ArrayList<String>();
		religiones.add("Catolicismo");
		
		BibliotecaDeCiudades ciudades = new BibliotecaDeCiudades();
		ciudades.agregarCiudad("Colombo", 6.928517, 79.854897, "Una descripcion", "Azul", "Peso", new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>(), religiones, "Gobierno", new ArrayList<String>(), "Banco", "Biblioteca", "Puerto");
		ciudades.agregarCiudad("Budapest", 47.498613, 19.030053, "Una descripcion", "Azul", "Peso", new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>(), religiones, "Gobierno", new ArrayList<String>(), "Banco", "Biblioteca", "Puerto");
		//ciudades.agregarCiudad("Buenos Aires", -34.577777, -58.455510," ", "Azul", "Peso", new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>(), new ArrayList<String>(), "Gobierno", new ArrayList<String>(), "Banco", "Biblioteca", "Puerto");
		
		this.ciudadDeSalida = ciudades.obtenerCiudad("Colombo");
		this.ciudadDeLlegada = ciudades.obtenerCiudad("Budapest");
				
		Recorrido unRecorrido = new Recorrido(ciudadDeSalida);
		unRecorrido.agregarCiudad(ciudadDeLlegada);
				
		BibliotecaDeObjetosRobados objetosRobados = new BibliotecaDeObjetosRobados(ciudades);			
		objetosRobados.agregarObjetoRobadoComun("Libro","Colombo");	
		
		this.ladrones = new BibliotecaDeLadrones();
		ladrones.agregarLadron("Lady Agatha", "Femenino", "Tenis", "Rojo","Anillo", "Descapotable");
		
		GeneradorDePistas generadorDePistas = new GeneradorDePistas();
		generadorDePistas.agregarPistaDeCiudad("La religion es el %s.", "facil", "religion");		
		
		this.casoActual = new Caso(unLadron, unRecorrido, objetosRobados.obtenerUnObjetoRobadoComun(),  elTiempo, ciudades, generadorDePistas, ladrones);
		
	}
	
	
	@Test
	public void testEntrarAEdificioDevuelveLaPistaCorrespondienteAlEdificio(){
		
		GradoStateNovato novato = new GradoStateNovato();
		Biblioteca unaBiblioteca = new Biblioteca(false);
		Pista pistaDelaBiblioteca = this.casoActual.entrarAEdificio(novato, unaBiblioteca);
		Assert.assertEquals(PistaDeReligion.class, pistaDelaBiblioteca.getClass());			
		
	}	
	
	
	@Test (expected = LadronAtrapado.class)
	public void testAtraparAlLadronDebeArrojarExcepcion(){
		
		Policia unPoli = new Policia("Lucia");	
		Assert.assertEquals(unLadron.obtenerNombre(), casoActual.emitirOrdenDeArresto("Femenino", "Tenis", "Rojo","Anillo", "Descapotable").obtenerNombre());
		casoActual.emitirOrdenDeArresto("Femenino", "Tenis", "Rojo","Anillo", "Descapotable");
		casoActual.policiaViajaA(unPoli.obtenerVelocidad(), ciudadDeLlegada);		
				
	}
	
	/*@Test
	public void testDeLosTresEdificiosEnUnaCiudadUnoDebeDarUnaPistaSobreElLadron(){
		
		Banco unBanco = new Banco(true);
		GeneradorDePistas generadorPistas = new GeneradorDePistas();
		generadorPistas.agregarPistaLadron("Lo vi jugando al %s", "Hobby");
		generadorPistas.agregarPistaDeCiudad("La bandera es %s", "facil", "bandera");
		generadorPistas.agregarPistaDeCiudad("La moneda de la ciudad es %s", "facil", "moneda");
		generadorPistas.agregarPistaDeCiudad("La gente es %s", "facil", "gente");
		Policia unPoli = new Policia("Juanito");
		this.casoActual.policiaViajaA(unPoli.obtenerVelocidad(),this.ciudadDelCaso);
		Collection<Edificio> edificios = casoActual.obtenerLugares();
		Collection<Pista> pistasObtenidas = new ArrayList<Pista>();
		for (Edificio unEdificio : edificios){
			
			Pista unaPista = casoActual.entrarAEdificio(unPoli.obtenerGrado(), unEdificio);	
			pistasObtenidas.add(unaPista);
			
		}
		for (Pista unaPistaObtenida : pistasObtenidas){
			
			if (unaPistaObtenida.enString().equals(""))
		}
		
	}*/

	
	//ver que la pista del ladron sea de ese ladron en particular
	//o de la proxima ciudad
	

}
